package edu.upc.e402grupo02.e402grupo02.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import edu.upc.e402grupo02.e402grupo02.dao.CarteleraDAO;
import edu.upc.e402grupo02.e402grupo02.modelo.Cartelera;
import edu.upc.e402grupo02.e402grupo02.modelo.CarteleraId;
import edu.upc.e402grupo02.e402grupo02.modelo.Cine;
import edu.upc.e402grupo02.e402grupo02.modelo.Horario;
import edu.upc.e402grupo02.e402grupo02.modelo.Pelicula;

public class CarteleraDAOImpl implements CarteleraDAO{

	protected JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	
	
	public List<Cartelera> findByCine(String cineId) {
		System.out.println("Buscando en el Cine: " + cineId);
		System.out.println("----------------------------------");
		StringBuffer sql =  new StringBuffer();
		sql.append("SELECT ");
		sql.append("h.descripcion, p.id, p.titulo, s.nombre, ci.id, ci.nombre, ci.direccion, s.nombre  ");
		sql.append("FROM t_cartelera c ");
		sql.append("inner join t_cine ci on c.id_cine = ci.id ");
		sql.append("inner join t_pelicula p on c.id_pelicula = p.id ");
		sql.append("inner join t_horario h on c.id_horario = h.id ");
		sql.append("inner join t_sala s on c.id_sala = s.id ");
		sql.append("where ci.id = ? ");
		
		Object[] params = new Object[]{ cineId };
		
		List<Cartelera> list = jdbcTemplate.query(sql.toString(), params, new RowMapper<Cartelera>(){

			public Cartelera mapRow(ResultSet rs, int arg1) throws SQLException {
				Pelicula p = new Pelicula(rs.getString(2), rs.getString(3));
				CarteleraId id = new CarteleraId(rs.getString(1), p);
				Cartelera c = new Cartelera(id, rs.getString(8));
				Cine ci = new Cine(rs.getString(5), rs.getString(6));
				c.setCine(ci);
				System.out.println(c.toString());
				return c;
				
			}
			
		});
		
		if(list==null) System.out.println("No se encuentra la pelicula");
		else System.out.println("Se encontraron (" + list.size() + ") registros ");
		
		System.out.println();
		return list;
	}

	public List<Cartelera> findPeliculaByCine(String peliculaId, String cineId) {
		System.out.println("Buscando pelicula " + peliculaId + " en cine: " + cineId);
		System.out.println("----------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("SELECT ");
		sql.append("h.descripcion, p.id, p.titulo, s.nombre, ci.id, ci.nombre, ci.direccion, s.nombre  ");
		sql.append("FROM t_cartelera c ");
		sql.append("inner join t_cine ci on c.id_cine = ci.id ");
		sql.append("inner join t_pelicula p on c.id_pelicula = p.id ");
		sql.append("inner join t_horario h on c.id_horario = h.id ");
		sql.append("inner join t_sala s on c.id_sala = s.id ");
		sql.append("where ci.id = ? and p.id = ?");
		
		Object[] params = new Object[]{ cineId, peliculaId };
		
		List<Cartelera> list = jdbcTemplate.query(sql.toString(), params, new RowMapper<Cartelera>(){

			public Cartelera mapRow(ResultSet rs, int arg1) throws SQLException {
				Pelicula p = new Pelicula(rs.getString(2), rs.getString(3));
				CarteleraId id = new CarteleraId(rs.getString(1), p);
				Cartelera c = new Cartelera(id, rs.getString(8));
				Cine ci = new Cine(rs.getString(5), rs.getString(6));
				c.setCine(ci);
				System.out.println(c.toString());
				return c;
				
			}
			
		});
		
		if(list==null) System.out.println("No se encuentra la pelicula");
		else System.out.println("Se encontraron (" + list.size() + ") registros ");
		System.out.println();
		return list;
	}

	public List<Cartelera> findByHorario(Horario horario) {
		System.out.println("Buscando peliculas en el horario: " + horario.toString());
		System.out.println("----------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("SELECT ");
		sql.append("h.descripcion, p.id, p.titulo, s.nombre, ci.id, ci.nombre, ci.direccion, s.nombre  ");
		sql.append("FROM t_cartelera c ");
		sql.append("inner join t_cine ci on c.id_cine = ci.id ");
		sql.append("inner join t_pelicula p on c.id_pelicula = p.id ");
		sql.append("inner join t_horario h on c.id_horario = h.id ");
		sql.append("inner join t_sala s on c.id_sala = s.id ");
		sql.append("where h.id = ?");
		
		Object[] params = new Object[]{ horario.getValue() };
		
		List<Cartelera> list = jdbcTemplate.query(sql.toString(), params, new RowMapper<Cartelera>(){

			public Cartelera mapRow(ResultSet rs, int arg1) throws SQLException {
				Pelicula p = new Pelicula(rs.getString(2), rs.getString(3));
				CarteleraId id = new CarteleraId(rs.getString(1), p);
				Cartelera c = new Cartelera(id, rs.getString(8));
				Cine ci = new Cine(rs.getString(5), rs.getString(6));
				c.setCine(ci);
				System.out.println(c.toString());
				return c;
				
			}
			
		});
		
		if(list==null) System.out.println("No se encuentra la pelicula");
		else System.out.println("Se encontraron (" + list.size() + ") registros ");
		System.out.println();
		return list;
	}

	

}
